package com.hxgz.steel.controller.portal;

import com.hxgz.steel.common.Const;
import com.hxgz.steel.common.DemoBase;
import com.hxgz.steel.common.ResponseCode;
import com.hxgz.steel.common.ServerResponse;
import com.hxgz.steel.common.sdk.AcpService;
import com.hxgz.steel.common.sdk.LogUtil;
import com.hxgz.steel.common.sdk.SDKConfig;
import com.hxgz.steel.domain.User;
import com.hxgz.steel.dto.GetNumbersDto;
import com.hxgz.steel.service.MerchantPandectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author liuhuan
 * @description  店铺总览
 * @date 2019/1/24
 */
@RestController
@RequestMapping("merchantPandect")
@Api(tags="MerchantPandectController",description ="前台-卖家中心-店铺总览")
public class MerchantPandectController {

    @Autowired
    MerchantPandectService service;

    /**
     * 获取页面数据
     * @param httpServletRequest
     * @return
     */
    @RequestMapping(value="getNumbers.do",method = RequestMethod.POST)
    @ApiOperation("店铺总览-页面数据")
    public ServerResponse<GetNumbersDto> getNumbers(HttpServletRequest httpServletRequest){
        User user = Const.checkUserLogin(httpServletRequest);
        if(user == null){
            return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc());
        }
        return service.getNumbers(user.getId());
    }

    /**
     * B2B支付接口    merId=777290058166136     777290058166926
     * @return
     */
    @RequestMapping(value="B2BPAY.do",method = RequestMethod.GET)
    @ApiOperation("前台-B2B支付接口")
    public void B2BPAY(@RequestParam @ApiParam(value = "商户号码",required = true)String merId,
                                 @RequestParam @ApiParam(value = "订单金额（分）",required = true)String txnAmt, HttpServletResponse resp) {
        try {
            Map<String, String> requestData = new HashMap<String, String>();

            /***银联全渠道系统，产品参数，除了encoding自行选择外其他不需修改***/
            requestData.put("version", DemoBase.version);                  //版本号，全渠道默认值
            requestData.put("encoding", DemoBase.encoding);          //字符集编码，可以使用UTF-8,GBK两种方式
            requestData.put("signMethod", SDKConfig.getConfig().getSignMethod()); //签名方法
            requestData.put("txnType", "01");                          //交易类型 ，01：消费
            requestData.put("txnSubType", "01");                          //交易子类型， 01：自助消费
            requestData.put("bizType", "000202");                      //业务类型 000202: B2B
            requestData.put("channelType", "07");                      //渠道类型 固定07

            /***商户接入参数***/
            requestData.put("merId", merId);                              //商户号码，请改成自己申请的正式商户号或者open上注册得来的777测试商户号
            requestData.put("accessType", "0");                          //接入类型，0：直连商户
            requestData.put("orderId", DemoBase.getOrderId());             //商户订单号，8-40位数字字母，不能含“-”或“_”，可以自行定制规则
            requestData.put("txnTime", DemoBase.getCurrentTime());        //订单发送时间，取系统时间，格式为YYYYMMDDhhmmss，必须取当前时间，否则会报txnTime无效
            requestData.put("currencyCode", "156");                      //交易币种（境内商户一般是156 人民币）
            requestData.put("txnAmt", txnAmt);                              //交易金额，单位分，不要带小数点

            //前台通知地址 （需设置为外网能访问 http https均可），支付成功后的页面 点击“返回商户”按钮的时候将异步通知报文post到该地址
            //如果想要实现过几秒中自动跳转回商户页面权限，需联系银联业务申请开通自动返回商户权限
            //异步通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
            requestData.put("frontUrl", DemoBase.frontUrl);

            //后台通知地址（需设置为【外网】能访问 http https均可），支付成功后银联会自动将异步通知报文post到商户上送的该地址，失败的交易银联不会发送后台通知
            //后台通知参数详见open.unionpay.com帮助中心 下载  产品接口规范  网关支付产品接口规范 消费交易 商户通知
            //注意:1.需设置为外网能访问，否则收不到通知    2.http https均可  3.收单后台通知后需要10秒内返回http200或302状态码
            //    4.如果银联通知服务器发送通知后10秒内未收到返回状态码或者应答码非http200，那么银联会间隔一段时间再次发送。总共发送5次，每次的间隔时间为0,1,2,4分钟。
            //    5.后台通知地址如果上送了带有？的参数，例如：http://abc/web?a=b&c=d 在后台通知处理程序验证签名之前需要编写逻辑将这些字段去掉再验签，否则将会验签失败
            requestData.put("backUrl", DemoBase.backUrl);

            //实现网银前置的方法：
            //上送issInsCode字段，该字段的值参考《平台接入接口规范-第5部分-附录》（全渠道平台银行名称-简码对照表）2）联系银联业务运营部门开通商户号的网银前置权限
            //requestData.put("issInsCode", "ABC");                 //发卡机构代码

            // 订单超时时间。
            // 超过此时间后，除网银交易外，其他交易银联系统会拒绝受理，提示超时。 跳转银行网银交易如果超时后交易成功，会自动退款，大约5个工作日金额返还到持卡人账户。
            // 此时间建议取支付时的北京时间加15分钟。
            // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
            requestData.put("payTimeout", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date().getTime() + 15 * 60 * 1000));

            // 请求方保留域，
            // 透传字段，查询、通知、对账文件中均会原样出现，如有需要请启用并修改自己希望透传的数据。
            // 出现部分特殊字符时可能影响解析，请按下面建议的方式填写：
            // 1. 如果能确定内容不会出现&={}[]"'等符号时，可以直接填写数据，建议的方法如下。
    //		requestData.put("reqReserved", "透传信息1|透传信息2|透传信息3");
            // 2. 内容可能出现&={}[]"'符号时：
            // 1) 如果需要对账文件里能显示，可将字符替换成全角＆＝｛｝【】“‘字符（自己写代码，此处不演示）；
            // 2) 如果对账文件没有显示要求，可做一下base64（如下）。
            //    注意控制数据长度，实际传输的数据长度不能超过1024位。
            //    查询、通知等接口解析时使用new String(Base64.decodeBase64(reqReserved), Config.encoding);解base64后再对数据做后续解析。
    //		requestData.put("reqReserved", Base64.encodeBase64String("任意格式的信息都可以".toString().getBytes(Config.encoding)));

            /**请求参数设置完毕，以下对请求参数进行签名并生成html表单，将表单写入浏览器跳转打开银联页面**/
            Map<String, String> reqData = AcpService.sign(requestData, DemoBase.encoding);  //报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
            String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl();  //获取请求银联的前台地址：对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrl
            String html = AcpService.createAutoFormHtml(requestFrontUrl, reqData, DemoBase.encoding);   //生成自动跳转的Html表单

            LogUtil.writeLog("打印请求HTML，此为请求报文，为联调排查问题的依据：" + html);
            //将生成的html写到浏览器中完成自动跳转打开银联支付页面；这里调用signData之后，将html写到浏览器跳转到银联页面之前均不能对html中的表单项的名称和值进行修改，如果修改会导致验签不通过

            resp.getWriter().write(html);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
